package com.fileupload.process.strategy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.fileupload.utils.PathUtils;

/**
 * 文件完成操作抽象策略类
 * 提供策略的通用功能和辅助方法
 * @author 小乙
 */
public abstract class AbstractFileFinishActionStrategy implements FileFinishActionStrategy {
    
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    private final String strategyName;
    protected String monitorDir;
    
    public AbstractFileFinishActionStrategy(String strategyName) {
        this.strategyName = strategyName;
        this.monitorDir = "/home/data"; // 默认监控目录
    }
    
    /**
     * 构造函数
     * 
     * @param strategyName 策略名称
     * @param monitorDir 监控目录
     */
    public AbstractFileFinishActionStrategy(String strategyName, String monitorDir) {
        this.strategyName = strategyName;
        this.monitorDir = monitorDir != null ? monitorDir : "/home/data";
    }
    
    @Override
    public String getStrategyName() {
        return strategyName;
    }
    
    /**
     * 获取监控目录
     * 
     * @return 监控目录
     */
    protected String getMonitorDir() {
        return monitorDir;
    }
    
    /**
     * 设置监控目录
     * 
     * @param monitorDir 监控目录
     */
    public void setMonitorDir(String monitorDir) {
        this.monitorDir = monitorDir != null ? monitorDir : "/home/data";
    }
    
    /**
     * 创建目录（如果不存在）
     * 
     * @param dirPath 目录路径
     * @return 是否创建成功
     */
    protected boolean createDirectory(String dirPath) {
        if (dirPath == null || dirPath.isEmpty()) {
            return false;
        }
        
        Path path = Paths.get(dirPath);
        if (!Files.exists(path)) {
            try {
                Files.createDirectories(path);
                logger.debug("Created directory: {}", dirPath);
                return true;
            } catch (Exception e) {
                logger.error("Failed to create directory: {}", dirPath, e);
                return false;
            }
        }
        return true;
    }
    
    /**
     * 生成基于当前时间的目录结构
     * 格式：yyyy/MM/dd/HH
     * 
     * @return 时间目录结构
     */
    protected String getTimeBasedDirectory() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/HH");
        return sdf.format(new Date());
    }
    
    // 使用PathUtils代替内部方法
    
    /**
     * 规范化路径，统一分隔符
     * 
     * @param path 原始路径
     * @return 规范化后的路径
     */
    // 使用PathUtils代替内部方法
    
    /**
     * 获取文件的相对路径（相对于监控目录）
     * 支持Windows环境下的盘符处理
     * 
     * @param file 文件
     * @param monitorDir 监控目录
     * @return 相对路径
     */
    protected String getRelativePath(File file, String monitorDir) {
        String filePath = file.getParent();
        if (monitorDir == null || filePath == null) {
            return "";
        }
        
        // 规范化路径，统一分隔符
        String normalizedFilePath = PathUtils.normalizePath(filePath);
        String normalizedMonitorDir = PathUtils.normalizePath(monitorDir);
        
        // 首先移除盘符再进行比较，以确保在Windows环境下能够正确处理路径
        String filePathNoDrive = PathUtils.removeDriveLetter(normalizedFilePath);
        String monitorDirNoDrive = PathUtils.removeDriveLetter(normalizedMonitorDir);
        
        // 确保监控目录以正斜杠结尾，避免部分匹配
        if (!monitorDirNoDrive.endsWith("/")) {
            monitorDirNoDrive = monitorDirNoDrive + "/";
        }
        
        if (filePathNoDrive.startsWith(monitorDirNoDrive)) {
            logger.debug("基于文件路径创建子目录(移除盘符): {}", filePathNoDrive.substring(monitorDirNoDrive.length()));
            return filePathNoDrive.substring(monitorDirNoDrive.length()).replace('\\', '/');
        }
        
        // 作为备选，也尝试直接比较规范化后的路径（不带尾部斜杠检查）
        if (normalizedFilePath.startsWith(normalizedMonitorDir)) {
            return normalizedFilePath.substring(normalizedMonitorDir.length()).replace('\\', '/');
        }
        
        return "";
    }
}
